package com.nali.dal.expression.query;

import com.nali.dal.expression.Expression;

/**
 * Criteria<br>&nbsp;
 * 查询标准，统计服务通过Criteria及其包装类来查询数据
 * @author sam Created on 2011-3-8
 */
public enum Criteria implements Expression {
	//select 使用PropertyExpression作为查询条件
	select(CriteriaType.select),
	unselect(CriteriaType.select),
	//使用ExpressionValue作为查询条件的复杂查询key字段，value使用ExpressionDto<Criteria>或List<ExpressionValue>
	elemMatch(CriteriaType.select),
	//group by 使用PropertyExpression作为查询条件
	groupBy(CriteriaType.groupBy),
	//order by 使用PropertyExpression作为查询条件
	asc(CriteriaType.orderBy),
	desc(CriteriaType.orderBy),
	//where 使用ExpressionValue作为查询条件
	gt(CriteriaType.where),
	lt(CriteriaType.where),
	eq(CriteriaType.where),
	like(CriteriaType.where),
	ne(CriteriaType.where),
	gte(CriteriaType.where),
	lte(CriteriaType.where),
	in(CriteriaType.where),
	exists(CriteriaType.where),
	//组函数 使用PropertyExpression或ExpressionValue作为查询条件
	//（当作使用ExpressionValue时，带的值为函数返回值的keyname，PropertyExpression的keyname为propname_functionname）
	max(CriteriaType.groupFunction),
	min(CriteriaType.groupFunction),
	/**
	 * 暂时不支持，可以用sum除以count代替
	 */
	avg(CriteriaType.groupFunction),
	sum(CriteriaType.groupFunction),
	count(CriteriaType.groupFunction),
	//多列组函数 使用PropertyExpression或ExpressionValue作为查询条件
	//类似groupFunction，但是prop的值是用逗号多个字段名称的string，ExpressionValue的值也是返回值key的逗号拼接
	/**
	 * 取最大值，并带出当最大值时的其他属性
	 */
	maxRow(CriteriaType.multiGroupFunction),
	/**
	 * 取最小值，并带出当最小值时的其他属性
	 */
	minRow(CriteriaType.multiGroupFunction),
	//原生命令 使用PropertyExpression作为查询条件
	//prop的值是原生命令的表达式
	where(CriteriaType.nativeExpression),
	;
	public final CriteriaType type;
	
	private Criteria(CriteriaType type) {
		this.type = type;
	}
}